package objetos;


import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;


import fisica.ObjetoFisico;
import fisica.SimuladorFisico;



public class Heroi extends ObjetoFisico {
	BufferedImage charset = null;
	int charx = 0;
	int chary = 0;

	int frame = 0;
	int anim = 1;
	int animspd = 100;
	
	float posicaoInicial = 0;
	int somatimeanim = 0;

	public boolean debug = false;
	
	private float velocidadePulo = 400.5f;

	public ArrayList<Integer> mediaTempoPulo = new ArrayList<Integer>();

	double forcaN = 0;

	int aceleracaoY = 10;
	
	int alturaTotal = 140; //100
	int tempoPulo = 1000;
	
	float temEntrePulos = 1000;

	int tempoColisaoTraps=0;

	int tempoColisaoInimigo =0;

	int tempoColisaoPlataformaCair =0;

	boolean colidiuPlataformaFlutuante= false;

	double maxSpeed = 250;



	Graphics2D dbg2;


	boolean descer = false;


	boolean pulando = false;



	long tempoIntervalo = 5;



	double raio= 10;

    float picoMaxPulo;
    
    boolean resetaAtributosPulo;

	
	boolean sobePulo = false , descePulo = false;


	double frequencia = 0 , periodo = 0 , velocidadeAngular = 0;

	long tempo=0, tempoFinal=0, tempoInicial=0;

	double velocidadePadrao=150;

	double velocidadeEscalar=0, aceleracaoCentripeta=0;
	

	double forcaArtrito =0; // FORCA DE ATRITO

	double coeficienteAtrito= 0;

	double atritoAsfalto = 0.5; // asfalto seco
	double atritochao = 0.8;
	double atritoGelo = 0.03;

	int tipoVeiculo; // tipo de veiculo 1 para carro 2 para van 4 para caminhao

	float raioPerimetro = 100; // raioPerimetro de atack inimigos entram nesse
	// perimetro eles te atacam

	float pi = (float) 3.14;

	int centroX = 16;
	int centroY = 24;

	float distX, distY;

	int tirotimer = 0;
	
	int alturaRestante = 0;
	int tempoRestante = 0;

	public int life = 100;

	float vx = 0;
	float vy = 0;
	float velx = 200;
	float vely = 200;
	float oldX = 0, oldY = 0;
	float mediaDiff = 0;
	int diffCont = 0;
	float totalDiff = 0;

	public Heroi(float X, float Y, BufferedImage charset, int charx,
			int chary) {
		// TODO Auto-generated constructor stub
		
		this.X = X;
		this.Y = Y;
		this.charset = charset;
		this.charx = charx;
		this.chary = chary;
		
		this.altura = 47;
		this.largura = 20;
		
		this.coefAtrito = 0;
		this.velocidade = 100;
		this.aceleracao = 15;
		this.velocidadeInicial = 0;
		this.impulso = 600;
		this.massa = 80;
		this.raioDeColisao = 15;
		this.nome = "heroi";
		SimuladorFisico.getSimulador().addObject(this);
	


	}

	double ang = 0;

	@Override
	public void SimulaSe(long diftime) {
		// TODO Auto-generated method stub
		int bx = (int) ((X + 16) / 16);
		int by = (int) ((Y + 28) / 16);
		//velocidade = 60.0;
		//System.out.println("\n");
		//System.out.println("CanvasGame.instance.mapaGenerico.mapa2[by][bx] >> "+CanvasGame.instance.mapaGenerico.mapa2[by][bx]);
		//System.out.println("\n");
		
		if(this.estaColidindoChao){
			temEntrePulos+=diftime;
		}
		
		
		this.velocidade = (float)(velocidadePadrao*(this.massa/this.massaTemporaria));
		this.forcaEmpurro = velocidade;
//		System.out.println("heroi::simualse velocidade : "+velocidade);
		
		
		oldX = X;
		oldY = Y;

		
		frame = (somatimeanim / animspd) % 3;

		somatimeanim += diftime;
		frame = (somatimeanim / animspd) % 3;

		if (CanvasGame.instance.LEFT) {
			X -= velocidade * diftime / 1000.0f;
			anim = 1;
		
			if(velocidade > maxSpeed){
				velocidade = (float)maxSpeed;
			}

		} else if (CanvasGame.instance.RIGHT) {
			X += velocidade * diftime / 1000.0f;
			anim = 0;
			if(velocidade > maxSpeed){
				velocidade = (float)maxSpeed;
			}
		} else {
			if(anim == 0){
				frame = 2;
			}else{
				frame = 1;
			}
			somatimeanim = 0;
		}


		//forcaArtrito = atritoAsfalto*peso;

		tempo += diftime;

		tempoColisaoTraps += (int)(diftime);
		tempoColisaoInimigo += (int)(diftime);
		tempoColisaoPlataformaCair += (int)(diftime);



		if(diffCont < 30){
			diffCont++;
			totalDiff+= diftime;
		}else{
			mediaDiff =  totalDiff/30;
			diffCont = 0;
			totalDiff = 0;
		}


		if ((CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 143 && CanvasGame.instance.mapaGenerico.mapa2[by][bx] < 145) || CanvasGame.instance.mapaGenerico.mapa2[by][bx] == 113 || CanvasGame.instance.mapaGenerico.mapa2[by][bx] == 114){
			life = 0;
		}


		//if(CanvasGame.instance.trapBolaFerro.colisaoRetangular(CanvasGame.instance.heroi)){
		//	life -= 20;
		//	X += -10;
		//}


		//CanvasGame.instance.boxPush.colisaoRetangular(CanvasGame.instance.heroi);

		
		//System.out.println("Heroi::simulaSe : "+this.tempoNoAr);
		//if(CanvasGame.instance.plataformaCai1.colisaoRetangular(CanvasGame.instance.heroi)){
		//	CanvasGame.instance.plataformaCai1.cair = false;
		//	CanvasGame.instance.plataformaCai1.iniciar = false;
		//}

		//tempoIntervalo += diftime;
	



		// COLISAO COM A BORDA DA TELA
		if (X < 0) {
			X = (float) (oldX+1);
			Y = oldY;
		}
		
		if (Y < 0) {
			X = oldX;
			Y = (float) (oldY+5);

		}
		
		if (Y > 600) {
			X = oldX;
			Y = (float) (oldY-1);
		}

		
		
		//if (X >= (CanvasGame.mapaGenerico.Largura << 4) - 20) {
		//	X = oldX;
		//	Y = oldY;

		//}


	
		
		
		
		
			//System.out.println("\n sobePulo = true \n Pulando = true \n tempoPulo = "+tempoPulo+" \n ");
//
//		}else{
//			picoMaxPulo = 0;
//			sobePulo = false;
//			impulso = 600;
//			pulando = false;
//			
//			
//			Y = Y+peso* diftime / 1000.0f; // gravidade sempre Puxa para baixo
//		}
//
//
//		int bx = (int) ((X + 16) / 16);
//		int by = (int) ((Y + 28) / 16);
//
//		if (CanvasGame.instance.SPACE) {
//			if(pulando == false){
//				if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
//					sobePulo = true;
//				}
//			}
//
//		}	
//
//		if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] == 144 || CanvasGame.instance.mapaGenerico.mapa2[by][bx] == 145) {
//			life -= 30;
//		}
//
//		System.out.println("\n CanvasGame.instance.mapaGenerico.mapa2[by][bx]  = "+CanvasGame.instance.mapaGenerico.mapa2[by][bx] +" \n ");
//
//		if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
//			if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx+1] > 0) {
//				X = (float) (oldX-velocidade * diftime / 1000.0f);
//			}
//
//			if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx-1] > 0) {
//				X = (float) (oldX+velocidade * diftime / 1000.0f);
//			}
//			Y = oldY;
//		}
		
			

		if(CanvasGame.instance.SPACE == true && estaColidindoChao){
			velocidadeY = (-velocidadePulo);
			temEntrePulos = 0;
			estaColidindoChao = false;
			posicaoInicial = this.Y + this.alturaTotal;
		}					
		
		
		
		if(!this.estaColidindoChao){
			velocidadeY += (SimuladorFisico.getSimulador().valorGravidade*diftime)/1000;
		}else{
			velocidadeY = 0 ;
		}
		
		
			
		Y += velocidadeY*diftime/1000;          // NAO MUDAR DE LUGAR

		this.estaColidindoParede(diftime);
		this.estaColidindoTeto(diftime);
		this.estaColidindoChao(diftime);
		
		if(CanvasGame.instance.gerenciaInimigo.colisaoRetangular(this)){
			this.life = 0;
		}
		
	}
	
	@Override
	public boolean estaColidindoParede(long diftime) {
		int bx = (int) ((X + 16) / 16);
		int by = (int) ((Y + 28) / 16);
		
			if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx+1] > 0) {	
				CanvasGame.instance.RIGHT = false;
				X--;
				return true;
			}

			if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx-1] > 0) {
				CanvasGame.instance.LEFT = false;
				X++;
				return true;
			}
		
		return false;
	}
	
	public boolean estaColidindoTeto(long diftime) {
		int bx = (int) ((X + 16) / 16);
		int by = (int) ((Y + 28) / 16);
		
			if (CanvasGame.instance.mapaGenerico.mapa2[by-2][bx] > 0||CanvasGame.instance.mapaGenerico.mapa2[by-2][bx+1] > 0||CanvasGame.instance.mapaGenerico.mapa2[by-2][bx-1] > 0) {	
				velocidadeY = 15 ;
				return true;
			}

		return false;
	}

	@Override
	public boolean estaColidindoChao(long diftime){
		int bx = (int) ((X + 16) / 16);
		int by = (int) ((Y + 28) / 16);

		if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx-2] > 0 || CanvasGame.instance.mapaGenerico.mapa2[by-1][bx+2] > 0) {
			if (CanvasGame.instance.mapaGenerico.mapa2[by+1][bx] > 0 ){
					if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0 ){
						this.estaColidindoChao = true;
						return true;
					}
			}else{
				this.estaColidindoChao = false;
				return false;
			}
			
		}else{
			
			if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx] > 0) {
				if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
				   Y--;
				   estaColidindoChao(diftime);
				}
			}else{
				if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
					this.estaColidindoChao = true;
					return true;
				}else{
					this.estaColidindoChao = false;
					return false;
				}
			}
			
		}
		
		//this.tempoNoAr = 0;
		this.estaColidindoChao = false;
		return false;
	}
	@Override
	public void DesenhaSe(Graphics2D dbg, int mapx, int mapy) {

		dbg2 = dbg;

/*		dbg.drawImage(charset, (int) X - mapx, (int) Y - mapy, (int) (X + 20)
				- mapx, (int) (Y + 47) - mapy, 20 * frame + charx * 96, 47
				* anim + chary * 192, 20 * frame + 20 + charx * 96, 47 * anim
				+ 47 + chary * 192, null);
		dbg.setColor(Color.WHITE);*/
		
		
		dbg.drawImage(charset, (int) X - mapx, (int) Y - mapy, (int) (X + 20)
				- mapx, (int) (Y + 47) - mapy, 20 * frame + charx * 96, 47
				* anim + chary * 192, 20 * frame + 20 + charx * 96, 47 * anim
				+ 47 + chary * 192, null);
		dbg.setColor(Color.WHITE);
		
		
		dbg.drawString("Tempo Pulo: "+tempoPulo, 15, 40);


		if(CanvasGame.instance.tutorial){

			dbg.setColor(Color.RED);
			dbg.drawOval((int) (X - mapx - raio + centroX), (int) (Y - mapy
					- raio + centroY), (int) (raio * 2), (int) (raio * 2));
			dbg.setColor(Color.BLACK);
			dbg.drawRect((int) (X+5 - mapx), (int) (Y - mapy), (int) (23),
					(int) (47));
			dbg.drawOval((int)((this.X+this.largura/2)- mapx-this.raioDeColisao),(int)((this.Y+this.altura/2)- mapy-this.raioDeColisao), (int)this.raioDeColisao*2, (int)this.raioDeColisao*2);
		}

	}

	public boolean colisaoRetangular(Heroi p) {
		if (p.X + 20 < this.X) {
			return false;
		}
		if (p.X > this.X + 20) {
			return false;
		}
		if (p.Y + 47 < this.Y) {
			return false;
		}
		if (p.Y > this.Y + 47) {
			return false;
		}
		return true;
	}

	public boolean colisaoCircular(Heroi p) {
		float dx = (p.X + p.centroX) - (X + centroX);
		float dy = (p.Y + p.centroY) - (Y + centroY);
		float r2 = (float) (p.raio + raio);
		// System.out.println("r2 "+r2+" dx "+dx+" dy "+dy);
		r2 = r2 * r2;
		if (r2 > ((dx * dx) + (dy * dy))) {
			return true;
		}
		return false;
	}

	public void levaDano(int dano) {
		life -= dano;
		if (life < 0) {
			vivo = false;
		}
	}

	public double clamp_angle (double a)
	{
		// Clamp in radians
		a %= 2 * Math.PI;       // now in (-2pi, 2pi) range

		if (a < 0)
			a += 2 * Math.PI;   // now in [0, 2pi) range

		return a;
	}
}
